/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package models.negocio;

import config.LogErro;
import controllers.JdbcDimController;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import models.dados.JdbcDAO;
import models.entidades.Dimensao;
import teste.utilitario.GerarSQL;
import teste.utilitario.ManipulaHash;

/**
 *
 * @author Wenderson
 */
public class JdbcDimensao extends JdbcDAO {
    
    private PreparedStatement ps;
    private ResultSet rs;
 
    public int resultadoValorChaves(Dimensao dimensao, HashMap<String, String> chaves, ResultSet rsa) {
        try {
            int numColunas = rsa.getMetaData().getColumnCount();
            
            StringBuilder sb = new StringBuilder("SELECT COUNT(*), ");
            
            String chaveAlinhada = GerarSQL.select(ManipulaHash.list(chaves, false));
            
            sb.append(chaveAlinhada)
            .append(" FROM ")
            .append(dimensao.getEsquema())
            .append(".")
            .append(dimensao.getNome())
            .append(" WHERE ");
            
            int indiceColuna = 1;
            
            for (String chaved : chaves.keySet()) {
                sb.append(chaves.get(chaved))
                .append(" = ? AND ");
                
                indiceColuna = indiceColuna < numColunas ? ++indiceColuna : indiceColuna;
            }
            
            String str = sb.substring(0, sb.length() - 5);
            sb = new StringBuilder(str);
            
            sb.append(" GROUP BY ")
            .append(chaveAlinhada);
            
            ps = JdbcDimController.getPreparedStatement(sb.toString());
            
            indiceColuna = 1;
            
            for (String valor : chaves.keySet()) {
                ps.setObject(indiceColuna, rsa.getObject(indiceColuna));
                
                indiceColuna = indiceColuna < numColunas ? ++indiceColuna : indiceColuna;
            }
            
            rs = ps.executeQuery();
            
            int quantidade = 0;
            
            if (rs != null && rs.next()) {
                quantidade = rs.getInt(1);
            }
            
            rs.close();
            
            return quantidade;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return -1;
    }

    public int resultadoValorChaveAtributo(Dimensao dimensao, HashMap<String, String> chavesRef, ResultSet rsChave, String nomeAtr, Object valor) {
        try {
            int numColunas = rsChave.getMetaData().getColumnCount();
            
            StringBuilder sb = new StringBuilder("SELECT COUNT(*) ");
            sb.append(" FROM ")
            .append(dimensao.getEsquema())
            .append(".")
            .append(dimensao.getNome())
            .append(" WHERE ");
            
            int indiceColuna = 1;
            
            for (String chaveD : chavesRef.keySet()) {
                sb.append(chavesRef.get(chaveD))
                .append(" = ? AND ");
                
                indiceColuna = indiceColuna < numColunas ? ++indiceColuna : indiceColuna;
            }
            
            sb.append(nomeAtr)
            .append(" = ? ");
            
            ps = JdbcDimController.getPreparedStatement(sb.toString());
            
            indiceColuna = 1;
            
            for (String chaveD : chavesRef.keySet()) {
                ps.setObject(indiceColuna, rsChave.getObject(indiceColuna));
                
                indiceColuna = indiceColuna < numColunas ? ++indiceColuna : indiceColuna;
            }
            
            ps.setObject(++indiceColuna, valor);
            
            ResultSet rsD = ps.executeQuery();
            
            rsD.next();
            
            int quantidade = rsD.getInt(1);
            
            rsD.close();
            
            return quantidade;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return 0;
    }

    public int getDataFlCorrente(Dimensao dimensao, HashMap<String, String> chavesRef, ResultSet rsAux, String nomeDataFinal, String nomeFlag, String valorFl) {
        try {
            StringBuilder sb = new StringBuilder("SELECT COUNT(*) ");
            sb.append("FROM ")
            .append(dimensao.getEsquema())
            .append(".")
            .append(dimensao.getNome())
            .append(" a ")
            .append(" WHERE NOT (a.")
            .append(nomeDataFinal)
            .append(" IS NULL) AND a.")
            .append(nomeFlag)
            .append(" = ? AND ");
            
            for (String chaveDim : chavesRef.keySet()) {
                sb.append(chavesRef.get(chaveDim))
                .append(" = ? AND ");
            }
            
            String str = sb.substring(0, sb.length() - 4);
            sb = new StringBuilder(str);
            
            ps = JdbcDimController.getPreparedStatement(sb.toString());
            ps.setObject(1, valorFl);
            
            
            int indiceColuna = 2;
            int numColunas = rsAux.getMetaData().getColumnCount();
            
            for (String chaveDim  : chavesRef.keySet()) {
                ps.setObject(indiceColuna, rsAux.getString(indiceColuna - 1));
                
                ++indiceColuna;
            }
            
            rs = ps.executeQuery();
            
            int quantidade = 0;
            
            if (rs.next()) {
                quantidade = rs.getInt(1);
            }
            
            rs.close();
            
            return quantidade;
        } catch (Exception e) {
            LogErro.gravaErro(e);e.printStackTrace();
        }
        return -1;
    }
}
